package cn.chaos.bio01;

public class ByteView {

    
    public static void main(String[] args) {
        
       
        /*
         * 如果第 i 位为 1， 其他位为 0 ，值为 2^i
         */
        final int bit5 = (1 << 5);
        System.out.println(Integer.toBinaryString(bit5)+ ", " + bit5);
        
        final int bit7 = 0x80;
        System.out.println(Integer.toBinaryString(bit7)+ ", " + bit7);
        
        final int bits2and3 = 12; // 8 + 4 => 1100, 12
        System.out.println(Integer.toBinaryString(bits2and3) +", "+ bits2and3);
        

        final int bitmap = 1234567;
        System.out.println(Integer.toBinaryString(bitmap) +", "+ bitmap);
        
        /*
         * 要设置 int 变量中的特定的一个位的值为 1 
         * 需要将该 int 值与特定位对应的掩码进行
         * 按位或  |（bitwise-OR）
         */
        
        byte b = -128;
        System.out.println(Integer.toBinaryString(b));
        b |= bit5;
        System.out.println(Integer.toBinaryString(b));
        b |= bit5;
        System.out.println(Integer.toBinaryString(b));
        
        /*
         * 要清空特定一个位（设为0），要先将特定位所对应的掩码的按位补码（特定位位0，其他位为1）
         * 再将该数与掩码按位补码后的数进行按位与。
         * byte bit5f = ~bit5 // 100000 => 011111
         * b &= bit5f 
         */
        System.out.println("-------------");
        byte bit5f = ~bit5;
        System.out.println(Integer.toBinaryString(bit5));
        System.out.println(Integer.toBinaryString(bit5f));
        b &= ~bit5;
        System.out.println(Integer.toBinaryString(b));
        System.out.println(b);
        
        System.out.println("---------------");

        System.out.println(Integer.toBinaryString(-1));
        System.out.println(Integer.toBinaryString(-1 & (~(bits2and3 | bit5))));
        
        /*
         * 要测试一个整数的特定位置是否已经被设置，
         * 可以将该整数与特定位对应的掩码进行按位与，并将操作结果与 0 比较
         */
        System.out.println("-------------------");
        int bitmap2 = bitmap & ~ (1 << 6);
        System.out.println(Integer.toBinaryString(bitmap2));
        System.out.println(Integer.toBinaryString(1 << 6));
        System.out.println(Integer.toBinaryString(bitmap2 & (1 << 6)));
    }
}
